/***********************************************************************************************************************
* Copyright (C) . All rights reserved.
***********************************************************************************************************************/

/***********************************************************************************************************************
* File Name    : main.c
* Version      :
* Device(s)    : CMS32L032
* Tool-Chain   : MDK(armcc)
* Description  : This file is a template.
* Creation Date: 2022/5/30
***********************************************************************************************************************/

/***********************************************************************************************************************
Macro Definitions
***********************************************************************************************************************/

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include <stdio.h>
#include "Global.h"
#include "my_systick.h"
#include "crc.h"
#include "iap_ap_info.h"
#include "update_app_func.h"
#include "iap_update_app_protocol.h"
#include "wdt.h"
#include "my_common.h"
#include "iap_my_debug.h"

void Systick_irq_Func(void);

typedef  void  (*pAppFunction) (void);
pAppFunction Application;
uint32_t AppAddress;

volatile uint32_t tmp_data=0;
/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/

int main()
{
	SystemCoreClockUpdate();

	systick_config(Systick_irq_Func);

	{
		#ifdef DEBUG_MODE
		MyDebugConfig();
		Debug_PrintfChar("iap start\r\n");
		#endif
	}
	while(1)
	{
		get_firmware_info();
		SCB->VTOR = AP_CODE_START;
		ww(UPDATE_MODE_ID_ADDR, BOOT_MODE_APP); 
		if (((*(__IO uint32_t*)AP_CODE_START) & 0x2FFE0000 ) == 0x20000000)
		{
			AppAddress = *(__IO uint32_t*) (AP_CODE_START + 4);	//应用程序起始地址偏移4，为reset中断程序服务地址
			Application = (pAppFunction) AppAddress;//将reset中断服务程序地址转换为函数指针

			/* Initialize user application's stack pointer */
			__set_MSP(*(__IO uint32_t*) AP_CODE_START);

			/* Jump to user application */
			Application();
		}
		// 实际项目可以使用 看门狗来复位 重新启动。

		while(1)
		{
			
		}
	} 

	
}


void Systick_irq_Func(void)
{
  	TimingDelay();
    get_char_timeout_func();
}

